//package com.iwhalecloud.bss.kite.cucc.common.datasource;
//
//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
//import org.springframework.util.ObjectUtils;
//
//import java.util.Objects;
//import java.util.Optional;
//import java.util.Stack;
//
///**
// * 数据源路由器
// */
//public class DataSourceRouter extends AbstractRoutingDataSource {
//
//    // 数据源路由上下文
//    private static final ThreadLocal<Stack<String>> dataSourceHolder = new ThreadLocal<>();
//
//    @Override
//    protected Object determineCurrentLookupKey() {
//        return getDataSourceName();
//    }
//
//    /**
//     * 设置数据源路由策略
//     * @param dataSourceName
//     */
//    public static void setDataSourceName(String dataSourceName) {
//        Stack<String> stack = dataSourceHolder.get();
//        if (Objects.isNull(stack)) {
//            stack = new Stack<>();
//            dataSourceHolder.set(stack);
//        }
//
//        stack.push(dataSourceName);
//    }
//
//    /**
//     * 获取数据源路由策略
//     * @return
//     */
//    public static String getDataSourceName() {
//        Stack<String> stack = dataSourceHolder.get();
//        return Optional.ofNullable(stack).map(s -> {
//            return ObjectUtils.isEmpty(s) ? null : s.lastElement();
//        }).orElse(null);
//    }
//
//    /**
//     * 删除最后一个数据源路由策略<br>
//     * 在多次数据源切换时，需要和setDataSourceName方法成对出现，保证数据源可以切回去
//     * @return
//     */
//    public static String popDataSourceName() {
//        Stack<String> stack = dataSourceHolder.get();
//        return Optional.ofNullable(stack).map(s -> {
//            return ObjectUtils.isEmpty(s) ? null : s.pop();
//        }).orElse(null);
//    }
//
//    /**
//     * 清理数据源路由策略上下文
//     */
//    public static void clear() {
//        dataSourceHolder.remove();
//    }
//}
